
package info.mikrotubula.agents;

import info.mikrotubula.db.Users;
import info.mikrotubula.managers.UsersManagerLocal;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

/**
 *
 * @author Krystian
 */
public class UsersAgent {

    private Users user = new Users();
    private Boolean userDataPaneActive = false;
    private Boolean userListActive = true;
    private List<Users> users;
    private Integer selectedUserIndex;
    private String usrPassConfirm;
    private Boolean editMode;
    private String searchString;
    
    
    @EJB
    private UsersManagerLocal usersManagerBean;
    
    /** Creates a new instance of UsersAgent */
    public UsersAgent() {
    }

    public void create() {
        if (!validateUser()) return;
        user.setUsrDate(new Date());
        usersManagerBean.createUser(getUser());
        if (user.getUsrId() == null) 
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Tworzenie użytkownika: Wystąpił błąd podczas tworzenia użytkownika", "Wystąpił błąd podczas tworzenia użytkownika"));
        else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Tworzenie użytkownika: Dodano użytkownika " + user.getUsrFirstName() + " " + user.getUsrLastName(), "Dodano użytkownika " + user.getUsrFirstName() + " " + user.getUsrLastName()));
            users.add(0, user);
            user = new Users();
            userDataPaneActive = false;
            userListActive = true;
        }
    }
    
    public void edit() {
        if (!validateUser()) return;
        if (usersManagerBean.edit(getUser())) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Edycja danych użytkownika: Edycja zakończona pomyślnie", "Edycja zakończona pomyślnie"));
            this.user = new Users();
        } else
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Edycja danych użytkownika: Edycja nie powiodła się", "Edycja nie powiodła się"));
    }
        
    public void delete() {
     if (user == null || user.getUsrId() == null) {
         FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Walidacja: Proszę wybrać użytkownika", "Proszę wybrać użytkownika"));
         return;
     }
     usersManagerBean.delete(user);
     user = null;
     users = null;
     getUsers();
    }
   
    public void refreshList() {
        users = null;
        getUsers();
    }
    
    public void search() {
        users = usersManagerBean.search(searchString.trim());
        if (users == null) FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,"Wyszukiwanie: Twoje zapytanie nie zwróciło żadnych wyników.", "Twoje zapytanie nie zwróciło żadnych wyników."));
        
    }
    
    public void selectUser() {
        this.setUser(getUsers().get(selectedUserIndex));
    }
    
    public void showNewUserPane() {
        this.user = new Users();
        this.userDataPaneActive = true;
        this.userListActive = false;
        this.setEditMode(false);
    }
    
    public void showEditUserPane() {
        this.userDataPaneActive = true;
        this.userListActive = true;
        this.setEditMode(true);
    }
    
    public void hideUserDataPane() {
        this.user = new Users();
        this.userDataPaneActive = false;
        this.userListActive = true;
    }
    
    /** validatory JSF nie sprawdzają nulli */
    private boolean validateUser() {
        if ((this.user.getUsrId()==null && editMode) || this.user.getUsrName() == null || this.user.getUsrFirstName() == null || this.user.getUsrLastName() == null
                || this.user.getUsrPass() == null) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Walidacja: Proszę wypełnić wszystkie dane", "Proszę wypełnić wszystkie dane"));
            return false;
        }
        if (!this.user.getUsrPass().equals(this.getUsrPassConfirm())) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Walidacja: Wprowadzone hasła nie są jednakowe", "Wprowadzone hasła nie są jednakowe"));
            return false;
        }
        return true;
    }

    public Boolean getUserDataPaneActive() {
        return userDataPaneActive;
    }

    public void setUserDataPaneActive(Boolean userDataPaneActive) {
        this.userDataPaneActive = userDataPaneActive;
    }

    public Integer getSelectedUserIndex() {
        return selectedUserIndex;
    }

    public void setSelectedUserIndex(Integer selectedUserIndex) {
        this.selectedUserIndex = selectedUserIndex;
    }
    
    public List<Users> getUsers() {
        if (users == null) this.users = usersManagerBean.getUsers();
        return users;
    }
    
    public void setUsers(List<Users> users) {
        this.users = users;
    }

    public String getUsrPassConfirm() {
        return usrPassConfirm;
    }

    public void setUsrPassConfirm(String usrPassConfirm) {
        this.usrPassConfirm = usrPassConfirm;
    }

    public Users getUser() {
        return user;
    }

    public void setUser(Users user) {
        this.user = user;
    }

    public Boolean getUserListActive() {
        return userListActive;
    }

    public void setUserListActive(Boolean userListActive) {
        this.userListActive = userListActive;
    }

    public Boolean getEditMode() {
        return editMode;
    }

    public void setEditMode(Boolean editMode) {
        this.editMode = editMode;
    }

    public String getSearchString() {
        return searchString;
    }

    public void setSearchString(String searchString) {
        this.searchString = searchString;
    }
}
